# Darren
# 2025年02月20日14时37分06秒
# 单继承

# 方法继承
class Animal:
    def eat(self):
        print('eat')

    def drink(self):
        print('drink')

    def run(self):
        print('run')

    def sleep(self):
        print('sleep')


class Dog(Animal):  # 继承 Animal
    def bark(self):
        print('bark')


class XiaoTianQuan(Dog):  # 继承Dog 继承具有传递性
    def fly(self):
        print('fly')

    def bark(self):  # 子类对父类方法重载 override
        super().bark()  # 调用父类中的bark()方法
        print('像神一样叫')
        self.fly()  # 调用自己的方法


if __name__ == '__main__':
    wangcai = Dog()
    wangcai.eat()  # 调用父类Aniaml的方法
    wangcai.bark()
    xiaotianquan = XiaoTianQuan()
    xiaotianquan.sleep()
    xiaotianquan.bark()

print('-' * 50)


# 父类的私有属性和私有方法子类不能直接访问
class A:
    def __init__(self):
        self.num1 = 100
        self.__num2 = 200

    def __test(self):
        print("私有方法 %d %d" % (self.num1, self.__num2))

    def test_1(self):
        print(self.__num2)


class B(A):
    def demo(self):
        # 1. 在子类的对象方法中，不能访问父类的私有属性
        # print("访问父类的私有属性 %d" % self.__num2)
        # 2. 在子类的对象方法中，不能调用父类的私有方法
        # self.__test()
        pass


b = B()
print(b)
b.demo()
b.test_1()  # 子类通过父类公共方法访问私有属性

# 在外界不能直接访问对象的私有属性/调用私有方法
# print(b.__num2)
# b.__test()

print('-' * 50)


# 属性继承
class Animal:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("吃---")

    def run(self):
        print("跑---")


class Dog(Animal):
    def __init__(self, name, color):  # override
        super().__init__(name)  # 子类对象调用父亲的 init
        self.color = color

    def bark(self):
        print('汪汪叫')


if __name__ == '__main__':
    dog = Dog('大黄', '黄色')
    print(dog.name)
    print(dog.color)
    dog.bark()
